home *** CD-ROM | disk | FTP | other *** search
/ Aminet 44 / Aminet 44 (2001)(GTI - Schatztruhe)[!][Aug 2001].iso / Aminet / dev / moni / systemviewer.lha / SysAssigns.c < prev    next >
C/C++ Source or Header  |  2001-04-25  |  19KB  |  816 lines

  1. /****h* SysAssigns [1.1] **********************************************
  2. *
  3. * NAME
  4. *    SysAssigns
  5. *
  6. * DESCRIPTION
  7. *    Display the logical assignments known to the OS.
  8. *
  9. *  GUI Designed by : Jim Steichen
  10. ***********************************************************************
  11. *
  12. */
  13.  
  14. #include <string.h>
  15.  
  16. #include <exec/types.h>
  17. #include <exec/memory.h>
  18.  
  19. #include <AmigaDOSErrs.h>
  20.  
  21. #include <dos/dosextens.h>
  22.  
  23. #include <intuition/intuition.h>
  24. #include <intuition/classes.h>
  25. #include <intuition/classusr.h>
  26. #include <intuition/gadgetclass.h>
  27.  
  28. #include <libraries/gadtools.h>
  29.  
  30. #include <graphics/displayinfo.h>
  31. #include <graphics/gfxbase.h>
  32.  
  33. #include <clib/exec_protos.h>
  34. #include <clib/intuition_protos.h>
  35. #include <clib/gadtools_protos.h>
  36. #include <clib/graphics_protos.h>
  37. #include <clib/utility_protos.h>
  38. #include <clib/diskfont_protos.h>
  39. #include <clib/dos_protos.h>
  40.  
  41. #include "CPGM:GlobalObjects/CommonFuncs.h"
  42.  
  43. #include "SysLists.h"
  44.  
  45. #define ALV      0
  46. #define Update   1
  47. #define Cancel   2
  48. #define AddBt    3
  49. #define RemoveBt 4
  50.  
  51. #define Asgn_CNT 5
  52.  
  53. PRIVATE char ver[] = "\0$VER: SysAssigns 1.1 (25-Apr-2001) by J.T. Steichen\0";
  54.  
  55. typedef struct {
  56.  
  57.    LONG   Address;
  58.    STRPTR Name;
  59.    STRPTR Path;
  60.  
  61. } Assign;
  62.  
  63. PRIVATE Assign *Assignments = NULL;
  64.  
  65. PRIVATE char can[256] = { 0, }, *CurrentAssignName = &can[0];
  66.  
  67. PRIVATE struct TextFont     *AsgnFont  = NULL;
  68. PRIVATE struct Window       *AsgnWnd   = NULL;
  69. PRIVATE struct Gadget       *AsgnGList = NULL;
  70. PRIVATE struct IntuiMessage  AsgnMsg;
  71. PRIVATE struct Gadget       *AsgnGadgets[ Asgn_CNT ];
  72.  
  73. PRIVATE UWORD  AsgnLeft   = 0;
  74. PRIVATE UWORD  AsgnTop    = 16;
  75. PRIVATE UWORD  AsgnWidth  = 635;
  76. PRIVATE UWORD  AsgnHeight = 230;
  77. PRIVATE UBYTE *AsgnWdt    = (UBYTE *) "System Assigns Info:";
  78.  
  79. // -------------------------------------------------------------------
  80.  
  81. #define STRLENGTH 80
  82.  
  83. PRIVATE char ltitle[] = "Address  Assign               Path";
  84. PRIVATE char fmt[]    = "%08LX %-20.20s %-40.40s";
  85.  
  86. PRIVATE struct List  ALVList  = { 0, };
  87.  
  88. PRIVATE struct Node  ALVNode  = { 0, };
  89. PRIVATE struct Node *ALVNodes = NULL;
  90.  
  91. PRIVATE UBYTE       *NodeStrs = NULL;
  92.  
  93. PRIVATE struct ListViewMem lvm = { 0, };
  94.     
  95. // -------------------------------------------------------------------
  96.  
  97. PRIVATE UWORD AsgnGTypes[] = {
  98.  
  99.    LISTVIEW_KIND, BUTTON_KIND, BUTTON_KIND, 
  100.    BUTTON_KIND,   BUTTON_KIND
  101. };
  102.  
  103. PRIVATE int ALVClicked(      int whichitem );
  104. PRIVATE int UpdateClicked(   int dummy     );
  105. PRIVATE int CancelClicked(   int dummy     );
  106. PRIVATE int AddBtClicked(    int dummy     );
  107. PRIVATE int RemoveBtClicked( int dummy     );
  108.  
  109. PRIVATE struct NewGadget AsgnNGad[] = {
  110.  
  111.      2,   3, 627, 200,                NULL, NULL, ALV,    0, 
  112.    NULL, (APTR) ALVClicked,
  113.  
  114.      4, 205,  71,  17, (UBYTE *) "_Update", NULL, Update, PLACETEXT_IN, 
  115.    NULL, (APTR) UpdateClicked,
  116.  
  117.    554, 205,  72,  17, (UBYTE *) "_Cancel", NULL, Cancel, PLACETEXT_IN, 
  118.    NULL, (APTR) CancelClicked,
  119.  
  120.     80, 205,  71,  17, (UBYTE *) "_Add",    NULL, AddBt, PLACETEXT_IN, 
  121.    NULL, (APTR) AddBtClicked,
  122.  
  123.    160, 205,  71,  17, (UBYTE *) "Remove",  NULL, RemoveBt, PLACETEXT_IN, 
  124.    NULL, (APTR) RemoveBtClicked,
  125. };
  126.  
  127. PRIVATE ULONG AsgnGTags[] = {
  128.  
  129.    GTLV_ShowSelected, 0, LAYOUTA_Spacing, 2, TAG_DONE,
  130.  
  131.    GT_Underscore, '_', TAG_DONE,
  132.    GT_Underscore, '_', TAG_DONE,
  133.    GT_Underscore, '_', TAG_DONE,
  134.    GT_Underscore, '_', TAG_DONE
  135. };
  136.  
  137. // --------------------------------------------------------------------
  138.  
  139. PRIVATE int AssignmentCount = 0;
  140.  
  141. PRIVATE int CountAssignments( void )
  142. {
  143.    struct DosList *dl   = NULL;
  144.    int             rval = 0;
  145.  
  146.    dl = LockDosList( LDF_ASSIGNS | LDF_READ );
  147.  
  148.    while ((dl = NextDosEntry( dl, LDF_ASSIGNS )) != NULL)
  149.       rval++;
  150.  
  151.    UnLockDosList( LDF_ASSIGNS | LDF_READ );
  152.  
  153.    return( rval );
  154. }
  155.  
  156. PRIVATE STRPTR MakeSTRPTR( BSTR s )
  157. {
  158.    STRPTR ris;
  159.    STRPTR eq;
  160.     
  161.    if (s == NULL)
  162.       return( NULL );
  163.  
  164.    eq = (STRPTR) BADDR( s );
  165.  
  166.    if (eq[0] == NULL)
  167.       return( NULL );
  168.  
  169.    ris = (STRPTR) malloc( eq[0] + 2 );
  170.  
  171.    memcpy( ris, eq + 1, eq[0] );
  172.  
  173.    ris[ eq[0] ] = 0;
  174.  
  175.    strcat( ris, ":" ); // Add a Colon to indicate Logical Assignment.
  176.  
  177.    return( ris );
  178. }
  179.  
  180. PRIVATE char strtmp[256] = "";
  181.  
  182. PRIVATE int GetAssignmentList( void )
  183. {
  184.    struct DosList *dl = NULL;
  185.    int             i;
  186.    
  187.    AssignmentCount = CountAssignments();
  188.    
  189.    Assignments = (Assign *) malloc( AssignmentCount * sizeof( Assign ) );
  190.  
  191.    if (Assignments == NULL)
  192.       {
  193.       return( -1 );
  194.       }
  195.       
  196.    dl = LockDosList( LDF_ASSIGNS | LDF_READ );
  197.    i  = 0;
  198.  
  199.    while ((dl = NextDosEntry( dl, LDF_ASSIGNS )) != NULL)
  200.       {
  201.       NameFromLock( dl->dol_Lock, strtmp, 255 );
  202.  
  203.       Assignments[i].Address = dl;
  204.       Assignments[i].Name    = MakeSTRPTR( dl->dol_Name );
  205.       Assignments[i].Path    = strdup( strtmp );
  206.  
  207.       i++;
  208.       }
  209.  
  210.    UnLockDosList( LDF_ASSIGNS | LDF_READ );
  211.    return( 0 );
  212. }
  213.  
  214. PRIVATE void FreeDosList( void )
  215. {
  216.    int i;
  217.  
  218.    for (i = 0; i < AssignmentCount; i++)
  219.       {
  220.       free( Assignments[i].Name ); // malloc in MakeSTRPTR().
  221.       free( Assignments[i].Path ); // alloc'd by strdup() function.
  222.       }
  223.  
  224.    free( Assignments );
  225.  
  226.    Assignments     = NULL;
  227.    AssignmentCount = 0;
  228.  
  229.    return;
  230. }
  231.  
  232. PRIVATE int MakeAssignList( void )
  233. {
  234.    int i = 1; // Skip the titles in NodeStrs[0].
  235.  
  236.    for (i = 1; i < AssignmentCount; i++)
  237.       {
  238.       sprintf( &NodeStrs[ i * STRLENGTH ], fmt,
  239.  
  240.                Assignments[ i - 1 ].Address,
  241.                Assignments[ i - 1 ].Name,
  242.                Assignments[ i - 1 ].Path
  243.              );
  244.       }
  245.  
  246.    return( 0 );
  247. }
  248.  
  249. PRIVATE void CloseAsgnWindow( void )
  250. {
  251.    if (AsgnWnd != NULL)
  252.       {
  253.       CloseWindow( AsgnWnd );
  254.       AsgnWnd = NULL;
  255.       }
  256.  
  257.    if (AsgnGList != NULL)
  258.       {
  259.       FreeGadgets( AsgnGList );
  260.       AsgnGList = NULL;
  261.       }
  262.  
  263.    if (AsgnFont != NULL)
  264.       {
  265.       CloseFont( AsgnFont );
  266.       AsgnFont = NULL;
  267.       }
  268.  
  269.    return;
  270. }
  271.  
  272. PRIVATE int AsgnCloseWindow( void )
  273. {
  274.    CloseAsgnWindow();
  275.    return( (int) FALSE );
  276. }
  277.  
  278. PRIVATE int CancelClicked( int dummy )
  279. {
  280.    return( AsgnCloseWindow() );
  281. }
  282.  
  283. PRIVATE int ALVClicked( int whichitem )
  284. {
  285.    if (whichitem == 0)
  286.       {
  287.       strcpy( CurrentAssignName, "" );
  288.  
  289.       DisplayTitle( AsgnWnd, AsgnWdt );
  290.       return( (int) TRUE );
  291.       }
  292.    else
  293.       {
  294.       char t[32], *tmp = &t[0];
  295.       
  296.       strncpy( tmp, 
  297.                (char const *) Assignments[ whichitem - 1 ].Name, 
  298.                31
  299.              );
  300.  
  301.       strcpy( CurrentAssignName, 
  302.               (char const *) Assignments[ whichitem - 1 ].Name
  303.             );
  304.       
  305.       DisplayTitle( AsgnWnd, tmp );
  306.       }
  307.  
  308.    return( (int) TRUE );
  309. }
  310.  
  311. PRIVATE int UpdateClicked( int dummy )
  312. {
  313.    int i;
  314.  
  315.    DisplayTitle( AsgnWnd, AsgnWdt );
  316.  
  317.    HideListFromView( AsgnGadgets[ ALV ], AsgnWnd );   
  318.  
  319.    // See if the list of assignments has grown bigger:
  320.  
  321.    if ((i = CountAssignments()) > AssignmentCount)
  322.       {
  323.       // Deallocate old data in memory, we need a bigger list:
  324.       FreeDosList();
  325.       FreeVec( NodeStrs );
  326.       FreeVec( ALVNodes );
  327.       NodeStrs = NULL;
  328.       ALVNodes = NULL;
  329.  
  330.       // Allocate a new area in memory for the data:
  331.  
  332.       if (GetAssignmentList() < 0)  // Recalculate AssignmentCount also.
  333.          {
  334.          SetReqButtons( "Aaarrrggghhh!!" );
  335.  
  336.          sprintf( ErrMsg, "Out of memory space, Aborting!!" );
  337.  
  338.          (void) Handle_Problem( ErrMsg, "System Problem:", NULL );
  339.  
  340.          return( FALSE );
  341.          }
  342.  
  343.       if ((ALVNodes = (struct Node *) 
  344.                        AllocVec( sizeof( struct Node ) 
  345.                                          * (AssignmentCount + 1),
  346.                                  MEMF_CLEAR 
  347.                                )
  348.          ) == NULL)
  349.          {
  350.          int ans = 0;
  351.  
  352.          sprintf( ErrMsg, "Out of memory space, Abort?" );
  353.          ans = Handle_Problem( ErrMsg, "System Problem:", NULL );
  354.  
  355.          if (ans == 0)
  356.             return( TRUE );
  357.          else
  358.             return( FALSE );
  359.          }
  360.  
  361.       if ((NodeStrs = (char *) 
  362.                        AllocVec( STRLENGTH * (AssignmentCount + 1),
  363.                                  MEMF_CLEAR 
  364.                                )
  365.          ) == NULL)
  366.          {
  367.          int ans = 0;
  368.  
  369.          FreeVec( ALVNodes );
  370.  
  371.          sprintf( ErrMsg, "Out of memory space, Abort?" );
  372.          ans = Handle_Problem( ErrMsg, "System Problem:", NULL );
  373.  
  374.          if (ans == 0)
  375.             return( TRUE );
  376.          else
  377.             return( FALSE );
  378.          }
  379.  
  380.       // Copy the title into the top node of the list view:
  381.       strcpy( &NodeStrs[0], ltitle );
  382.  
  383.       CopyMem( (char *) &ALVNode, (char *) ALVNodes, 
  384.                (long) sizeof( struct Node )
  385.              );
  386.  
  387.       lvm.lvm_NodeStrs   = &NodeStrs[0];
  388.       lvm.lvm_Nodes      = &ALVNodes[0];
  389.       lvm.lvm_NumItems   = AssignmentCount;
  390.       lvm.lvm_NodeLength = STRLENGTH;
  391.  
  392.       SetupList( &ALVList, &lvm );      
  393.       } 
  394.  
  395.    for (i = 1; i < AssignmentCount; i++)
  396.        NodeStrs[ i * STRLENGTH ] = '\0'; // Kill old ListView strings.
  397.  
  398.    // Make the list:
  399.    (void) MakeAssignList();
  400.  
  401.    ModifyListView( AsgnGadgets[ ALV ], AsgnWnd, &ALVList, NULL );
  402.  
  403.    GT_RefreshWindow( AsgnWnd, NULL );
  404.    return( (int) TRUE );
  405. }
  406.  
  407. PRIVATE int AddBtClicked( int dummy )
  408. {
  409.    IMPORT char *assignname;
  410.    IMPORT char *pathname;
  411.  
  412.    int rval = AddAssignment();
  413.       
  414.    if (rval < 0)
  415.       {
  416.       sprintf( ErrMsg, "Couldn't open an Add Assignment Requester!" );
  417.       
  418.       SetReqButtons( "OKAY" );
  419.       (void) Handle_Problem( ErrMsg, "Program Problem:", NULL );
  420.       SetReqButtons( "CONTINUE|ABORT!" );
  421.       }
  422.    else if (rval == FALSE)
  423.       {
  424.       DisplayTitle( AsgnWnd, AsgnWdt );
  425.       return( (int) TRUE ); // User pressed the CANCEL button.
  426.       }
  427.    else if (rval > 1)
  428.       {
  429.       char cmd[256] = "";
  430.  
  431.       if (strlen( assignname ) < 1)
  432.          {
  433.          SetReqButtons( "Aaarrgghh!!" );
  434.  
  435.          Handle_Problem( "You didn't supply a name for the assignemnt!",
  436.                          "User ERROR:", NULL
  437.                        );
  438.  
  439.          SetReqButtons( "CONTINUE|ABORT!" );
  440.  
  441.          DisplayTitle( AsgnWnd, AsgnWdt );
  442.          return( (int) TRUE );
  443.          }      
  444.  
  445.       if (strlen( pathname ) < 1)
  446.          {
  447.          SetReqButtons( "Aaarrgghh!!" );
  448.  
  449.          Handle_Problem( "You didn't supply a pathname for the assignemnt!",
  450.                          "User ERROR:", NULL
  451.                        );
  452.  
  453.          SetReqButtons( "CONTINUE|ABORT!" );
  454.    
  455.          DisplayTitle( AsgnWnd, AsgnWdt );
  456.          return( (int) TRUE );
  457.          }      
  458.  
  459.       if (strstr( assignname, ":" ) == NULL)
  460.          strcat( assignname, ":" ); // User didn't supply the colon!
  461.          
  462.       sprintf( &cmd[0], "Assign %s %s", assignname, pathname );      
  463.  
  464.       if (System( &cmd[0], TAG_DONE ) < 0)
  465.          {
  466.          sprintf( ErrMsg,
  467.                   "'%s'\ncouldn't be run by the System,"
  468.                   "\ncheck your spelling!",
  469.                   cmd
  470.                 );
  471.  
  472.          (void) Handle_Problem( ErrMsg, "Invalid Command Path?", NULL );
  473.    
  474.          DisplayTitle( AsgnWnd, AsgnWdt );
  475.          return( (int) TRUE );
  476.          }
  477.  
  478.       Delay( 30 );
  479.       (void) UpdateClicked( 0 );
  480.       }      
  481.  
  482.    DisplayTitle( AsgnWnd, AsgnWdt );
  483.    return( (int) TRUE );
  484. }
  485.  
  486. PRIVATE int RemoveBtClicked( int dummy )
  487. {
  488.    char cmd[256] = "";
  489.    int  ans = 0;
  490.    
  491.    if (strlen( CurrentAssignName ) < 1)
  492.       {
  493.       SetReqButtons( "Aaarrgghh!!" );
  494.  
  495.       Handle_Problem( "Click on an Assignment in the List View first!",
  496.                       "User ERROR:", NULL
  497.                     );
  498.  
  499.       SetReqButtons( "CONTINUE|ABORT!" );
  500.  
  501.       DisplayTitle( AsgnWnd, AsgnWdt );
  502.       return( (int) TRUE );
  503.       }
  504.  
  505.    // -------------------------------------------------------
  506.    SetReqButtons( "I'm SURE!|No Way!" );
  507.  
  508.    sprintf( ErrMsg, "Are you sure you want to remove %s?", 
  509.             CurrentAssignName
  510.           );
  511.    
  512.    ans = Handle_Problem( ErrMsg, "Sanity Check:", NULL ); 
  513.  
  514.    SetReqButtons( "CONTINUE|ABORT!" );
  515.  
  516.  
  517.    if (ans != 0)
  518.       {
  519.       DisplayTitle( AsgnWnd, AsgnWdt );
  520.       return( (int) TRUE );
  521.       }
  522.    // -------------------------------------------------------
  523.       
  524.    sprintf( &cmd[0], "Assign %s REMOVE", CurrentAssignName );
  525.  
  526.    if (System( &cmd[0], TAG_DONE ) < 0)
  527.       {
  528.       sprintf( ErrMsg,
  529.                "'%s'\ncouldn't be run by the System,"
  530.                "\ncheck your spelling!",
  531.                cmd
  532.              );
  533.  
  534.       (void) Handle_Problem( ErrMsg, "Invalid Command Path?", NULL );
  535.    
  536.       DisplayTitle( AsgnWnd, AsgnWdt );
  537.       return( (int) TRUE );
  538.       }
  539.  
  540.    Delay( 30 );
  541.    (void) UpdateClicked( 0 );
  542.  
  543.    DisplayTitle( AsgnWnd, AsgnWdt );
  544.    return( (int) TRUE );
  545. }
  546.  
  547.  
  548. PRIVATE int AsgnVanillaKey( int whichkey )
  549. {
  550.    int rval = TRUE;
  551.    
  552.    switch (whichkey)
  553.       {
  554.       case 'a':
  555.       case 'A':
  556.          rval = AddBtClicked( 0 );
  557.          break;
  558.  
  559.       case 'u':
  560.       case 'U':
  561.          rval = UpdateClicked( 0 );
  562.          break;
  563.       
  564.       case 'c':
  565.       case 'C':
  566.       case 'q':
  567.       case 'Q':
  568.       case 'x':
  569.       case 'X':
  570.          rval = CancelClicked( 0 );
  571.       
  572.       default:
  573.          break;
  574.       }
  575.        
  576.    return( rval );
  577. }
  578.  
  579. PRIVATE int HandleAsgnIDCMP( void )
  580. {
  581.    struct IntuiMessage *m = NULL;
  582.    int                (*func)( int code );
  583.    BOOL                 running = TRUE;
  584.  
  585.    while (running == TRUE)
  586.       {
  587.       if ((m = GT_GetIMsg( AsgnWnd->UserPort )) == NULL)
  588.          {
  589.          (void) Wait( 1L << AsgnWnd->UserPort->mp_SigBit );
  590.          continue;
  591.          }
  592.  
  593.       CopyMem( (char *) m, (char *) &AsgnMsg, 
  594.                (long) sizeof( struct IntuiMessage )
  595.              );
  596.  
  597.       GT_ReplyIMsg( m );
  598.  
  599.       switch ( AsgnMsg.Class )
  600.          {
  601.          case IDCMP_REFRESHWINDOW:
  602.             GT_BeginRefresh( AsgnWnd );
  603.             GT_EndRefresh( AsgnWnd, TRUE );
  604.             break;
  605.  
  606.          case IDCMP_CLOSEWINDOW:
  607.             running = AsgnCloseWindow();
  608.             break;
  609.  
  610.          case IDCMP_VANILLAKEY:
  611.             running = AsgnVanillaKey( (int) AsgnMsg.Code );
  612.             break;
  613.  
  614.          case IDCMP_GADGETUP:
  615.          case IDCMP_GADGETDOWN:
  616.             func = (void *)((struct Gadget *) AsgnMsg.IAddress)->UserData;
  617.  
  618.             if (func != NULL)
  619.                running = func( (int) AsgnMsg.Code );
  620.    
  621.             break;
  622.          }
  623.       }
  624.  
  625.    return( running );
  626. }
  627.  
  628. PRIVATE int OpenAsgnWindow( void )
  629. {
  630.    struct NewGadget  ng;
  631.    struct Gadget    *g;
  632.    UWORD             lc, tc;
  633.    UWORD             wleft = AsgnLeft, wtop = AsgnTop, ww, wh;
  634.  
  635.    ComputeFont( Scr, Font, &CFont, AsgnWidth, AsgnHeight );
  636.  
  637.    ww = ComputeX( CFont.FontX, AsgnWidth );
  638.    wh = ComputeY( CFont.FontY, AsgnHeight );
  639.  
  640.    if ((wleft + ww + CFont.OffX + Scr->WBorRight) > Scr->Width)
  641.       wleft = Scr->Width - ww;
  642.  
  643.    if ((wtop + wh + CFont.OffY + Scr->WBorBottom) > Scr->Height)
  644.       wtop = Scr->Height - wh;
  645.  
  646.    if ((AsgnFont = OpenDiskFont( Font )) == NULL)
  647.       return( -5 );
  648.  
  649.    if ((g = CreateContext( &AsgnGList )) == NULL)
  650.       return( -1 );
  651.  
  652.    for (lc = 0, tc = 0; lc < Asgn_CNT; lc++)
  653.       {
  654.       CopyMem( (char *) &AsgnNGad[lc], (char *) &ng, 
  655.                (long) sizeof( struct NewGadget )
  656.              );
  657.  
  658.       ng.ng_VisualInfo = VisualInfo;
  659.       ng.ng_TextAttr   = Font;
  660.  
  661.       ng.ng_LeftEdge   = CFont.OffX + ComputeX( CFont.FontX, 
  662.                                                 ng.ng_LeftEdge
  663.                                               );
  664.  
  665.       ng.ng_TopEdge    = CFont.OffY + ComputeY( CFont.FontY, 
  666.                                                 ng.ng_TopEdge
  667.                                               );
  668.  
  669.       ng.ng_Width      = ComputeX( CFont.FontX, ng.ng_Width );
  670.       ng.ng_Height     = ComputeY( CFont.FontY, ng.ng_Height );
  671.  
  672.       AsgnGadgets[lc] = g = CreateGadgetA( (ULONG) AsgnGTypes[lc], 
  673.                               g, 
  674.                               &ng, 
  675.                               (struct TagItem *) &AsgnGTags[tc] );
  676.  
  677.       while (AsgnGTags[tc] != NULL)
  678.          tc += 2;
  679.  
  680.       tc++;
  681.  
  682.       if (g == NULL)
  683.          return( -2 );
  684.       }
  685.  
  686.    if ((AsgnWnd = OpenWindowTags( NULL,
  687.  
  688.                     WA_Left,        wleft,
  689.                     WA_Top,         wtop,
  690.                     WA_Width,       ww + CFont.OffX + Scr->WBorRight,
  691.                     WA_Height,      wh + CFont.OffY + Scr->WBorBottom,
  692.  
  693.                     WA_IDCMP,       LISTVIEWIDCMP | BUTTONIDCMP 
  694.                       | IDCMP_CLOSEWINDOW | IDCMP_REFRESHWINDOW 
  695.                       | IDCMP_VANILLAKEY,
  696.  
  697.                     WA_Flags,       WFLG_DRAGBAR | WFLG_DEPTHGADGET 
  698.                       | WFLG_CLOSEGADGET | WFLG_SMART_REFRESH 
  699.                       | WFLG_ACTIVATE | WFLG_RMBTRAP,
  700.  
  701.                     WA_Gadgets,     AsgnGList,
  702.                     WA_Title,       AsgnWdt,
  703.                     WA_ScreenTitle, ScrTitle,
  704.                     TAG_DONE )
  705.       ) == NULL)
  706.       return( -4 );
  707.  
  708.    GT_RefreshWindow( AsgnWnd, NULL );
  709.  
  710.    return( 0 );
  711. }
  712.  
  713. PUBLIC int main( void )
  714. {
  715.    int i = 0;
  716.  
  717.    if (SetupSystemList( &OpenAsgnWindow ) < 0)
  718.       {
  719.       fprintf( stderr, "Couldn't open a System ListViewer!\n" );
  720.       return( RETURN_FAIL );
  721.       }
  722.    
  723.    SetNotifyWindow( AsgnWnd );
  724.  
  725.    AssignmentCount = CountAssignments();
  726.  
  727.    ALVNode.ln_Succ = (struct Node *) ALVList.lh_Tail;
  728.    ALVNode.ln_Pred = (struct Node *) ALVList.lh_Head;
  729.    ALVNode.ln_Type = NT_USER;
  730.    ALVNode.ln_Pri  = AssignmentCount - 129;
  731.    ALVNode.ln_Name = ltitle;
  732.  
  733.    if ((ALVNodes = (struct Node *) 
  734.                     AllocVec( sizeof( struct Node ) 
  735.                                       * (AssignmentCount + 1),
  736.                               MEMF_CLEAR 
  737.                             )
  738.       ) == NULL)
  739.       {
  740.       sprintf( ErrMsg, "Out of memory space, Abort?" );
  741.       
  742.       SetReqButtons( "Aaarrgghh!!" );
  743.       (void) Handle_Problem( ErrMsg, "System Problem:", NULL );
  744.  
  745.       ShutdownSystemList();
  746.       return( ERROR_NO_FREE_STORE );
  747.       }
  748.  
  749.    if ((NodeStrs = (char *) 
  750.                     AllocVec( STRLENGTH * (AssignmentCount + 1),
  751.                               MEMF_CLEAR 
  752.                             )
  753.       ) == NULL)
  754.       {
  755.       FreeVec( ALVNodes );
  756.  
  757.       sprintf( ErrMsg, "Out of memory space, Abort?" );
  758.  
  759.       SetReqButtons( "Aaarrgghh!!" );
  760.       (void) Handle_Problem( ErrMsg, "System Problem:", NULL );
  761.  
  762.       ShutdownSystemList();
  763.       return( ERROR_NO_FREE_STORE );
  764.       }
  765.  
  766.    strcpy( &NodeStrs[0], ltitle );
  767.  
  768.    CopyMem( (char *) &ALVNode, (char *) ALVNodes, 
  769.             (long) sizeof( struct Node )
  770.           );
  771.  
  772.    lvm.lvm_NodeStrs   = &NodeStrs[0];
  773.    lvm.lvm_Nodes      = &ALVNodes[0];
  774.    lvm.lvm_NumItems   = AssignmentCount;
  775.    lvm.lvm_NodeLength = STRLENGTH;
  776.  
  777.    SetupList( &ALVList, &lvm );
  778.  
  779.    if (GetAssignmentList() < 0)
  780.       {
  781.       sprintf( ErrMsg, "Out of memory space, Abort?" );
  782.  
  783.       FreeVec( NodeStrs );
  784.       FreeVec( ALVNodes );
  785.  
  786.       SetReqButtons( "Aaarrgghh!!" );
  787.       (void) Handle_Problem( ErrMsg, "System Problem:", NULL );
  788.  
  789.       ShutdownSystemList();
  790.       return( ERROR_NO_FREE_STORE );
  791.       }
  792.       
  793.    // Make the list:
  794.    (void) MakeAssignList();   
  795.  
  796.    ModifyListView( AsgnGadgets[ ALV ], AsgnWnd, 
  797.                    (struct List *) &ALVList, NULL
  798.                  );
  799.  
  800.    GT_RefreshWindow( AsgnWnd, NULL );
  801.  
  802.    (void) HandleAsgnIDCMP();
  803.    
  804.    ShutdownSystemList();
  805.  
  806.    FreeVec( NodeStrs );
  807.    FreeVec( ALVNodes );
  808.  
  809.    if (Assignments != NULL)
  810.       FreeDosList();
  811.       
  812.    return( RETURN_OK );
  813. }
  814.  
  815. /* --------------------- END of SysAssigns.c file! -------------- */
  816.